package negocio.bd;

import base.Aviso;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import utiles.ConexionBD;
import utiles.ConversorFecha;
import utiles.Logger;

/**
 *
 * @author Efren
 */
public class BDAviso {
    public static final String idAviso = "idAviso";
    public static final String estaNotificado = "estaNotificado";
    public static final String descripcion = "descripcion";
    public static final String dniCliente = "idTarea";
    public static final String fecha = "fecha";
    public static final int buscarNotificadas = 1;
    public static final int buscarSinNotificar = 2;
    public static final int buscarPorDNICliente = 3;
    public static final int buscarPorFecha = 4;
    public static final int aviso = 1;
    public static final int DESC = 2;
    public static final int DEFAULT_ORDER = 0;
    
    public static Aviso[] buscar(int campoBusqueda, String busqueda, int orden, boolean exacta){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Aviso> avisos = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Avisos` ";
        switch (campoBusqueda){
            case buscarNotificadas:
                query += "WHERE " + estaNotificado + " = 1 ORDER BY "+ estaNotificado ;
                break;
            case buscarSinNotificar:
                query += "WHERE " + estaNotificado + " = 0 ORDER BY "+ estaNotificado;
                break;
            case buscarPorFecha:
                query += "WHERE " + fecha + " <=  NOW() ORDER BY " + fecha;
                break;
            default:
                query += "WHERE " + dniCliente + " like '" + busqueda + "%' ORDER BY " + dniCliente;
                //Si la busqueda a de ser exacta quitar like y % de la consulta
            if (exacta){
                query = query.replaceAll("like", "=");
                query = query.replace("%", "");
            }
           if (orden == DESC){
                    query += " DESC";
                } else {
                    query += " ASC";
                }
        }
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Aviso temp = new Aviso();
                temp.setIdAviso(res.getLong(idAviso));
                temp.setDescripcion(res.getString(descripcion));
                temp.setIdTarea(res.getLong(dniCliente));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fecha)));
                if (res.getInt(estaNotificado) == 1){
                    temp.notificar();
                }
                avisos.add(temp);
            }
            return avisos.toArray(new Aviso[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static Aviso obtener(long idAviso){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Avisos` WHERE " + BDAviso.idAviso + " = " + idAviso);
            while (res.next()){
                Aviso temp = new Aviso();
                temp.setIdAviso(res.getLong(BDAviso.idAviso));
                temp.setDescripcion(res.getString(descripcion));
                temp.setIdTarea(res.getLong(dniCliente));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fecha)));
                if (res.getInt(estaNotificado) == 1){
                    temp.notificar();
                }
                return temp;
            }
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean existe(long idAviso){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Avisos` WHERE " + BDAviso.idAviso + " = " + idAviso);
            if (res.next()){
                return true;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }
    public static Aviso[] obtenerTodos(){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Aviso> avisos = new ArrayList<>(0);
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Avisos`");
            while (res.next()){
                Aviso temp = new Aviso();
                temp.setIdAviso(res.getLong(idAviso));
                temp.setDescripcion(res.getString(descripcion));
                temp.setIdTarea(res.getLong(dniCliente));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fecha)));
                if (res.getInt(estaNotificado) == 1){
                    temp.notificar();
                }
                avisos.add(temp);
            }
            return avisos.toArray(new Aviso[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean insertar(Aviso aviso){
        if (!existe(aviso.getIdAviso())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`. `Avisos` (`estaNotificado`,`descripcion`,`idTarea`,`fecha`) VALUES (?,?,?,?)");
                if (aviso.isNotificado()){
                    insert.setInt(1,1);
                } else {
                    insert.setInt(1, 0);
                }
                insert.setString(2, aviso.getDescripcion());
                insert.setLong(3, aviso.getIdTarea());
                insert.setString(4, ConversorFecha.getFechaFormatoBD(aviso.getFecha()));
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    public static boolean actualizar(Aviso aviso){
        if (existe(aviso.getIdAviso())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement update = db.prepareStatement("UPDATE `gestionTienda`.`Avisos` SET " + estaNotificado + " = ? ," + descripcion + " = ? ," + dniCliente +" = ?, fechaNotificado = ? WHERE " + BDAviso.idAviso + " = ?");
                if (aviso.isNotificado()){
                    update.setInt(1, 1);
                } else {
                    update.setInt(1,0);
                }
                update.setString(2, aviso.getDescripcion());
                update.setLong(3, aviso.getIdTarea());
                update.setString(4, ConversorFecha.formatearSoloFecha(new GregorianCalendar()));
                update.setLong(5, aviso.getIdAviso());
                //La fecha no se modifica al actualizar.
                //update.setString(5, ConversorFecha.getFechaFormatoBD(aviso.getFecha()));
                if (update.executeUpdate()==1){
                    return true;
                }
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
}